package com.atwisdom.star.core.dsl.modelClass.utils;

import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.atwisdom.star.common.util.JsonUtil;
import org.apache.commons.lang.StringUtils;

import java.util.ArrayList;
import java.util.List;

public class ListHier {
    private String type;
    private List<ListHierContent> content = new ArrayList<>();
    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }


    public List<ListHierContent> getContent() {
        return content;
    }

    public void setContent(List<ListHierContent> content) {
        this.content = content;
    }

    public ListHier() {

    }
    public ListHier(JSONObject hierProperties) {
        if (hierProperties != null && hierProperties.size() > 0) {
            this.type = hierProperties.getString("type");
            JSONArray properties = hierProperties.getJSONArray("properties");
            JSONObject link = hierProperties.getJSONObject("link");
            JSONObject jsonObject = this.fetchValues(properties);
            ListHierContent hierContent = new ListHierContent();
            hierContent.setValues(jsonObject);
            hierContent.setLink(link);
            hierContent.setType(type);
            content.add(hierContent);
        }
    }

    /**
     * 获取默认values
     *
     * @return 返回结果
     */
    public JSONObject fetchValues(JSONArray properties) {
        JSONObject values = new JSONObject();
        for (Object item : properties) {
            JSONObject itemJson = JsonUtil.toJSONObject(item);
            String name = itemJson.getString("name");
            if(StringUtils.isNotBlank(name)){
                values.put(itemJson.getString("name"), itemJson.get("defaultValue"));
            }
        }
        return values;
    }

    /**
     * 将当前实例转换成JSONObject
     * @return 返回结果
     */
    public JSONObject fetchJsonObject() {
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("type", this.type);
        JSONArray contentAry = JSONArray.parseArray(JSONArray.toJSONString(this.content));
        jsonObject.put("content", contentAry);
        return jsonObject;
    }

    public static JSONObject fetchUpdateHier(JSONObject hierProperties, JSONObject updateHier) {
        if(hierProperties==null || hierProperties.size() <1){
            return new JSONObject();
        }
        ListHier initListHier = new ListHier(hierProperties);
        if(updateHier==null || updateHier.size() == 0){
           return initListHier.fetchJsonObject();
        }

        ListHierContent initHierContent = initListHier.getContent().get(0);
        JSONObject link = hierProperties.getJSONObject("link");
        String modelLinkClassName = link.getString("className");
        String linkModel = link.getString("linkModel");
        String LinkClassName = link.getString("linkClassName");
        JSONObject initValues = initHierContent.getValues();
        ListHier updateListHier = JSONObject.parseObject(JSON.toJSONString(updateHier), ListHier.class);
        List<ListHierContent> hierContents = new ArrayList<>();
        updateListHier.getContent().forEach(c->{
            JSONObject contentLink = c.getLink();
            c.setType("list");
            String insLinkClassName = contentLink.getString("className");
            if(StrUtil.isNotBlank(insLinkClassName) && modelLinkClassName.equalsIgnoreCase(insLinkClassName)){
                JSONObject updateValues = c.getValues();
                JSONObject values = JsonUtil.merge(initValues, updateValues);
                c.setValues(values);
                hierContents.add(c);
            }
        });
        updateListHier.setContent(hierContents);
        return updateListHier.fetchJsonObject();
    }

}
